#Ana Loureiro 104063

import numpy as np
import matplotlib.pyplot as plt


m = 75          # massa (kg)
P = 250  # W 
v0 = 2  #m/s

u = 0.005
Cres = 0.8
A = 0.3
rho_ar = 1.225

#b)
d_total = 3



def forca_rolamento(m, g, u):
    return -u * m * g

def forca_ar(Cres, A, rho_ar, v):
    return -0.5 * Cres * A * rho_ar * abs(v) * v

def forca_ciclista(P, v):
    return P / v

def trapezoidal_integral(y_values, dt):
  
    y_values = np.asarray(y_values)
    integral = dt * (0.5 * y_values[0] + np.sum(y_values[1:-1]) + 0.5 * y_values[-1])
    return integral


def simular_movimento(m, P, v0, d_objetivo, u, Cres, A, rho_ar, g=9.8, dt=0.1):

    t = [0]
    v = [v0]
    x = [0]
    Work = [0]
    faArray = []

    i = 0
    while x[-1] < d_objetivo:
        fr = forca_rolamento(m, g, u)
        fa = forca_ar(Cres, A, rho_ar, v[i])
        fc = forca_ciclista(P, v[i])


        F_total = fr + fa + fc
        a = F_total / m
        
        v_new = v[i] + a * dt
        x_new = x[i] + v[i] * dt
        t_new = t[i] + dt
        W_new = Work[i] + P * dt 

    
        v.append(v_new)
        x.append(x_new)
        t.append(t_new)
        Work.append(W_new)
        faArray.append(fr)
        
        i += 1

    return t[-1], x[-1], v[-1], Work[-1], t, x, v, faArray




t, x, v, W, t1, x1, v1, far = simular_movimento(m, P, v0, d_total, u, Cres, A, rho_ar)
Wfar= trapezoidal_integral(far, 0.001)



fig, ax = plt.subplots(2, 1, figsize=(10, 8))
ax[0].plot(t1, x1, label="Posição (m)")
ax[0].set_ylabel("Posição (m)")
ax[0].grid(True)
ax[0].legend()

ax[1].plot(t1, v1, label="Velocidade (m/s)", color='orange')
ax[1].set_xlabel("Tempo (s)")
ax[1].set_ylabel("Velocidade (m/s)")
ax[1].grid(True)
ax[1].legend()

plt.suptitle("Evolução da posição e velocidade")
plt.tight_layout()
plt.show()
 

print("Tempo total para percorrer 3 km: {:.2f} s".format(t))
print("Velocidade terminal: {:.2f} m/s".format(v))
print("Trabalho ResAr: {:.2f} kJ".format(Wfar))




